基于Ramfs的Rootfs配置

Version 1.0


1. 概述

RAMFS是Linux下的基于RAM的文件系统,效率较高。但它把rootfs都放在内存区,即使mount时指定了大小,也会导致占用的内存较大,并且RAMFS只能被root用户访问。


2. 基于alkaid平台配置Rootfs

基于alkaid平台配置Rootfs需要在已有配置的基础上进行配置。


2.1. 环境搭建

请参考环境搭建


2.2. ROOTFS分区配置

请参考系统分区

  1. 新增配置

    示例:

    cp /configs/defconfigs/ipc_m6_spinand.glibc-9.1.0-squashfs.016a.512x512.bga2_defconfig /configs/ipc/i6e/ipc_m6_spinand_ramfs.glibc-9.1.0-ramfs.squashfs.016a.512x512.bga2_defconfig
    

    修改变量:

    CONFIG_IMAGE_CONFIG: spinand.ramfs.partition.config
    
  2. IPL IPL_CUST等bin档修改

    对应文件:spinand.ramfs.partition.config

  3. 新增分区

    对应文件:spinand.ramfs.partition.config


2.3. 模块与库的存放与加载

为了实现系统的快速启动, 需要将rootfs的大小裁剪。

缩减rootfs大小示例方案:

第一阶段将对应的模块(ko)与动态库(so)放置到rootfs分区,分别是/lib/modules/与/lib

第二阶段将对应的模块(ko)与动态库(so)放置到miservice分区,分别是/config/modules/与/config/lib

配置文件:boot_sequence.mk

注意:

  1. 第一阶段占用系统内存,建议存放系统启动必备文件

  2. 第二阶段占用flash空间


3. initramfs的基本配置


3.1. 配置kernel以支持init ramfs

开启BLK_DEV_INITRD

General setup --->

Initial RAM filesystem and RAM disk (initramfs/initrd) support --->

重新烧录kernel生成的image


3.2. 制作 Rootfs

守护进程需要指定为init,请将/linuxrc重命名为init。

  1. 重命名

    mv $(OUTPUTDIR)/rootfs/linuxrc $(OUTPUTDIR)/rootfs/init
    
  2. 生成image

    gen_initramfs_list.sh -o name -u 0 -g 0 dir
    

    name: 生成的rootfs名字

    dir: rootfs 文件根目录

    gen_initramfs_list.sh: 生成rootfs的工具,详见linux/scripts


3.3. 启动系统

3.3.1. 从 IPL 快速启动

直接从IPL加载相应kernel跟rootfs到dram以节省加载uboot的时间,该方式需要对应的IPL档支持。

配置环境变量:

  1. 配置bootargs

    rootfstype=ramfs initrd=ROOTFS_ADDR, ROOTFS_BLK_SIZE

    ROOTFS_ADDR: rootfs加载地址

    ROOTFS_BLK_SIZE: rootfs所占ramfs大小

  2. 配置环境变量

    setenv initrd_high ROOTFS_ADDR

    setenv initrd_size ROOTFS_BLK_SIZE

    ROOTFS_ADDR: rootfs加载地址

    ROOTFS_BLK_SIZE: rootfs所占ramfs大小

  3. 其它注意事项:

    将守护进程重命名为init,可在rootfs.mk进行配置

    ## ramdisk/other use /linuxrc , ramfs use /init
    
    if [ "$(rootfs\$(FSTYPE))" = "ramfs" ]; then \\
    
    mv $(OUTPUTDIR)/rootfs/linuxrc $(OUTPUTDIR)/rootfs/init ; \\
    
    fi;
    

3.4.2. 从 Uboot 启动

从Uboot引导Kernel,需要配置相应的bootcmd来实现启动

配置环境变量:

  1. 配置bootargs

    rootfstype=ramfs initrd=ROOTFS_ADDR, ROOTFS_BLK_SIZE init=/linuxrc

    ROOTFS_ADDR: rootfs加载地址

    ROOTFS_BLK_SIZE: rootfs所占ramfs大小

  2. bootcmd 的配置

    nor:

    sf probe 0;sf read 0x22000000 ${sf_kernel_start} ${sf_kernel_size}; mxp r.info rootfs;sf read 0x23000000 ${sf_part_start} ${sf_part_size};bootm 0x22000000

    nand:

    nand read.e 0x22000000 KERNEL;nand read.e 0x23000000 rootfs 0x600000;bootm 0x22000000;nand read.e 0x22000000 RECOVERY;nand read.e 0x23000000 rootfs 0x600000;bootm 0x22000000